package Proyecto;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

import net.miginfocom.swing.MigLayout;
import Busqueda.Binaria;
import Busqueda.Hash;
import Busqueda.Secuencial;
import Componente.CompBoton;
import Componente.CompEtiqueta;
import Componente.ExtraerWord;
import Componente.Imprimir;
import Ordenamiento.Burbuja;
import Ordenamiento.QuickSort;
import Ordenamiento.Radix;
import Ordenamiento.Shell;

/**
 * Este podria ser el cascaron de nuestra GUI. Acepto sugerencias y comentarios
 * sobre como sera la estructura del programa PARA CREAR LOS ARREGLOS SE USARAN
 * LOS METODOS DE LA CLASE CArreglo.java que esta en este paquete tambien ACEPTO
 * SUGERENCIAS
 * 
 * @author HugoAlberto
 */
public class CEjercicio extends JFrame implements ActionListener
{
   private JLabel lPrincipal;
   private JPanel pContenido;
   private JTextField txtElementos,txtDesde,txtHasta;
   private CompBoton  boton[] =new CompBoton[5];
   private CArreglo   motor;
   private int        tamano,desde,hasta;
   private int[]      aux;
   private JSeparator separador,separador2;
   private JComboBox<String> ordenamientobox,busquedacombo;
   private JRadioButton      rdbtnAplicacion,rdbtnConcepto,rbtnAplicacion2,rdbtnConcepto2;
   private ButtonGroup       ordena,busca;
   
   public CEjercicio() throws HeadlessException
   {
      super("Estructura de datos");
      setBounds(0,0,600,378);
      setLocationRelativeTo(null);
      setResizable(false);
      setLookAndFeel();
      pContenido=new JPanel();
      lPrincipal=new JLabel("M\u00E9todos de B\u00FAsqueda y Ordenamiento");
      motor=new CArreglo();
      ordena=new ButtonGroup();
      busca=new ButtonGroup();
      tamano=desde=hasta=0;
      this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
      crear();
   }
   
   private void setLookAndFeel()
   {
      try
      {
         UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
      }
      catch(Exception e)
      {
      }
   }
   
   public void crear()
   {
      getContentPane().setLayout(new BorderLayout());
      getContentPane().add(lPrincipal,BorderLayout.NORTH);
      getContentPane().add(pContenido,BorderLayout.CENTER);
      pContenido.setLayout(new MigLayout("","[5px,grow,fill][5px,grow,fill][][10px,fill][][5px,grow,fill][5px,grow,fill]","[10px,grow,fill][10px,grow,fill][10px,grow,fill][10px,grow,fill][10px,grow,fill][10px,grow,fill][][][5px,grow,fill][5px,grow,fill][5px,grow,fill][5px,grow,fill]"));
      lPrincipal.setHorizontalAlignment(SwingConstants.CENTER);
      lPrincipal.setFont(new Font("Comic Sans MS",Font.BOLD,16));
      // anyadir etiquetas
      String ubicacion[]={"cell 0 0","cell 0 1,alignx trailing","cell 0 2,alignx trailing","cell 0 3,alignx trailing","cell 0 8,alignx trailing","cell 4 0"};
      String texto[]={":::Crear Arreglo:::","Numero de Elementos: ","Desde: ","Hasta: ",":::Busqueda:::",":::Ordenar:::"};
      for(int i=0; i<ubicacion.length; i++)
         new CompEtiqueta(texto[i],pContenido,ubicacion[i]);
      // anyadir botones
      String ubicacionB[]={"cell 0 4","cell 1 0","cell 1 4","cell 1 10 3 1","cell 4 4"};
      String textoB[]={"Crear","Limpiar....","Mostrar","Buscar!","Ordenar!"};
      for(int i=0; i<textoB.length; i++)
         boton[i]=new CompBoton(textoB[i],pContenido,this,ubicacionB[i]);
      rbtnAplicacion2=new JRadioButton("Aplicacion");
      busca.add(rbtnAplicacion2);
      separador=new JSeparator();
      separador.setForeground(SystemColor.activeCaption);
      separador.setOrientation(SwingConstants.VERTICAL);
      pContenido.add(separador,"cell 3 0 1 6");
      String[] items1={"Ordenamiento Interno","Burbuja","QuickSort","ShellSort","Radix"};
      ordenamientobox=new JComboBox<String>(items1);
      ordenamientobox.addActionListener(this);
      txtElementos=new JTextField();
      pContenido.add(txtElementos,"cell 1 1,growx");
      pContenido.add(ordenamientobox,"cell 4 1,growx");
      txtDesde=new JTextField();
      pContenido.add(txtDesde,"cell 1 2,growx");
      rdbtnAplicacion=new JRadioButton("Aplicacion");
      ordena.add(rdbtnAplicacion);
      pContenido.add(rdbtnAplicacion,"cell 4 2");
      txtHasta=new JTextField();
      pContenido.add(txtHasta,"cell 1 3,growx");
      rdbtnConcepto=new JRadioButton("Concepto");
      ordena.add(rdbtnConcepto);
      pContenido.add(rdbtnConcepto,"cell 4 3");
      separador2=new JSeparator();
      separador2.setBackground(SystemColor.activeCaption);
      pContenido.add(separador2,"cell 0 6 5 1,alignx center,aligny center");
      String[] items2={"Metodos de Busqueda","Busqueda Secuencial","Busqueda Binaria","Busqueda por funciones HASH"};
      busquedacombo=new JComboBox<String>(items2);
      busquedacombo.addActionListener(this);
      new CompEtiqueta("",pContenido,"cell 4 7  1 4","img/busqueda.png");
      pContenido.add(busquedacombo,"cell 1 8 3 1,growx");
      pContenido.add(rbtnAplicacion2,"cell 0 9");
      rdbtnConcepto2=new JRadioButton("Concepto");
      busca.add(rdbtnConcepto2);
      pContenido.add(rdbtnConcepto2,"cell 0 10");
      this.setVisible(true);
   }
   
   public void actionPerformed(ActionEvent pE)
   {
      if(pE.getSource().equals(boton[0]))
      {
         try
         {
            tamano=Integer.parseInt(txtElementos.getText());
            desde=Integer.parseInt(txtDesde.getText());
            hasta=Integer.parseInt(txtHasta.getText());
            aux=new int[tamano];
            aux=motor.llenarArray(desde,hasta,tamano);
         }
         catch(Exception e)
         {
            JOptionPane.showMessageDialog(null,"Datos Incorrectos,por favor introduzca solo numeros");
         }
      }
      else if(pE.getSource().equals(boton[2]))
      {
         try
         {
            motor.imprimir(aux);
         }
         catch(Exception e)
         {
            JOptionPane.showMessageDialog(null,"No se puede mostrar, Datos nulos o erroneos");
         }
      }
      else if(pE.getSource().equals(boton[4]))
      {
         if(rdbtnAplicacion.isSelected()==true)
         {
            if(ordenamientobox.getSelectedIndex()==1)
            {
               JOptionPane.showMessageDialog(null,"Ha seleccionado Aplicacion del Algoritmo Burbuja");
               Burbuja bj=new Burbuja();
               bj.ordenarBurbuja(aux);
            }
            if(ordenamientobox.getSelectedIndex()==2)
            {
               JOptionPane.showMessageDialog(null,"Ha seleccionado Aplicacion del Algoritmo QuickSort");
               new QuickSort().quickSort(aux, 0, aux.length-1);
            }
            if(ordenamientobox.getSelectedIndex()==3)
            {
               JOptionPane.showMessageDialog(null,"Ha seleccionado Aplicacion del Algoritmo ShellSort");
               Shell shllshrt=new Shell();
               shllshrt.ShellSort(aux);
            }
            if(ordenamientobox.getSelectedIndex()==4)
            {
               Radix rdx=new Radix();
               rdx.radixsort(aux);
               JOptionPane.showMessageDialog(null,"Ha seleccionado Aplicacion del Algoritmo Radix");
            }
         }
         if(rdbtnConcepto.isSelected()==true)
         {
            if(ordenamientobox.getSelectedIndex()==1)
               new Imprimir("Burbuja",new ExtraerWord("fuentes"+File.separator+"Burbuja.docx").leerDoc(),700,650);
            if(ordenamientobox.getSelectedIndex()==2)
               new Imprimir("QuickSort",new ExtraerWord("fuentes"+File.separator+"Quicksort.docx").leerDoc(),700,650);
            if(ordenamientobox.getSelectedIndex()==3)
               new Imprimir("Shell",new ExtraerWord("fuentes"+File.separator+"Shell.docx").leerDoc(),700,650);
            if(ordenamientobox.getSelectedIndex()==4)
               new Imprimir("Radix",new ExtraerWord("fuentes"+File.separator+"Radix.docx").leerDoc(),700,650);
         }
      }
      else if(pE.getSource().equals(boton[3]))
      {
         if(rbtnAplicacion2.isSelected()==true)
         {
            if(busquedacombo.getSelectedIndex()==1)
            {
               JOptionPane.showMessageDialog(null,"Ha seleccionado Busqueda Secuencial");
               try
               {
                  Secuencial scncl=new Secuencial();
                  scncl.busquedaSecuencial(aux);
                  new Imprimir(scncl.toString(),"",200,150);
               }
               catch(Exception e)
               {
                  JOptionPane.showMessageDialog(this,"No se pudo buscar");
               }
            }
            if(busquedacombo.getSelectedIndex()==2)
            {
               try
               {
                  int temp=Integer.parseInt(JOptionPane.showInputDialog("Ha seleccionado BUSQUEDA BINARIA\n"+
                        "Ingrese el numero a buscar"));
                  Binaria busquedaBinaria=new Binaria();
                  busquedaBinaria.buscar(aux,temp);
                  new Imprimir(busquedaBinaria.toString(),"",200,150);
               }
               catch(Exception e)
               {
                  JOptionPane.showMessageDialog(this,"No se pudo buscar");
               }
            }
            if(busquedacombo.getSelectedIndex()==3)
            {
               JOptionPane.showMessageDialog(null,"Ha seleccionado Busqueda HASH");
               try
               {
                  Hash hsh=new Hash();
                  hsh.pruebaLineal(aux);
                  new Imprimir(hsh.toString(),"",200,150);
               }
               catch(Exception e)
               {
                  JOptionPane.showMessageDialog(this,"No se pudo buscar");
               }
            }
         }
         if(rdbtnConcepto2.isSelected()==true)
         {
            if(busquedacombo.getSelectedIndex()==1)
               new Imprimir("SECUENCIAL",new ExtraerWord("fuentes"+File.separator+"Secuencial.docx").leerDoc(),700,650);
            if(busquedacombo.getSelectedIndex()==2)
               new Imprimir("Binaria",new ExtraerWord("fuentes"+File.separator+"Binaria.docx").leerDoc(),700,650);
            if(busquedacombo.getSelectedIndex()==3)
               new Imprimir("HASH",new ExtraerWord("fuentes"+File.separator+"Hash.docx").leerDoc(),700,650);
         }
      }
      else if(pE.getSource().equals(boton[1]))
      {
         if(txtElementos.getText().equals("")&&txtDesde.getText().equals("")&&txtHasta.getText().equals("")) JOptionPane.showMessageDialog(null,"Ya esta vacio, puedes continuar");
         else
         {
            txtDesde.setText("");
            txtElementos.setText("");
            txtHasta.setText("");
         }
      }
   }
}